home *** CD-ROM | disk | FTP | other *** search
- #import <stdio.h>
- #import "/LocalApps/Mathematica.app/Library/Mathematica/MathLink/Includes/mathlink.h"
-
- #define DEBUG FALSE
-
- void error(MLINK);
- void read_and_print_expression(MLINK);
- int ReadPacket(MLINK);
-
- void example_3(char *);
-
- MLINK link;
-
- main()
- {
- char result[10000];
-
- link = MLStart("math -mathlink -batchoutput -noinit");
-
- strcpy(result,"Expand[(1+x)^5]");
- example_3(result);
- printf("%s\n",result);
-
- MLClose(link);
- }
-
- void example_3(array)
- char *array;
- {
- char *rtn;
-
- MLPutFunction(link,"ToString",1);
- MLPutFunction(link,"InputForm",1);
- MLPutFunction(link,"ToExpression",1);
- MLPutString(link,array);
- MLEndPacket(link);
-
- if (DEBUG)
- {
- read_and_print_expression(link);
- return;
- }
-
- while (MLNextPacket(link) != RETURNPKT)
- {
- MLNewPacket(link);
- if (!MLCheck(link))
- error(link);
- }
-
- MLGetNext(link);
- MLGetString(link,&rtn);
- strcpy(array,rtn);
- }
-
- void error( mlp) MLINK mlp;
- {
- fprintf( stderr, "\nerror: %s\n", MLErrorMessage( mlp));
- MLClose( mlp);
- exit( 0);
- } /* error */
-
- void read_and_print_expression( p) MLINK p;
- {
- char *s;
- int n, i, len;
- double r;
- static int indent;
-
- i=MLGetNext(p);
- fprintf(stderr, "Packet type = %d\n",i);
-
- switch (i) {
- case MLTKSYM:
- MLGetSymbol( p, &s);
- fprintf( stderr, "%s ", s);
- break;
- case MLTKSTR:
- MLGetString( p, &s);
- fprintf( stderr, "\"%s\" ", s);
- break;
- case MLTKINT:
- MLGetInteger( p, &n);
- fprintf( stderr, "%d ", n);
- break;
- case MLTKREAL:
- MLGetReal( p, &r);
- fprintf( stderr, "%f ", r);
- break;
- case MLTKFUNC:
- indent += 3;
- fprintf( stderr, "\n %*.*s", indent, indent, "");
- if (MLGetArgCount( p, &len) == 0) {
- error( p);
- }else{
- read_and_print_expression(p);
- fprintf( stderr, "[");
- for (i = 1; i <= len; ++i) {
- read_and_print_expression(p);
- if (i != len) fprintf( stderr, ", ");
- }
- fprintf( stderr, "]");
- }
- indent -= 3;
- break;
- case MLTKERROR:
- default:
- error( p);
- }
- } /* read_and_print_expression */
-
-
- int ReadPacket( mlp) MLINK mlp;
- { int code;
- int len = 1;
-
- switch (code = MLNextPacket(mlp)) {
- case INPUTPKT:
- fprintf( stderr, "<INPUTPKT>");
- break;
- case OUTPUTPKT:
- fprintf( stderr, "<OUTPUTPKT>");
- break;
- case TEXTPKT:
- if (DEBUG) fprintf( stderr, "<TEXTPKT>");
- break;
- case RETURNPKT:
- fprintf( stderr, "Result (expression):");
- break;
- case RETURNTEXTPKT:
- fprintf( stderr, "=");
- break;
- case MESSAGEPKT:
- len = 2;
- fprintf( stderr, "\nMessage packet:");
- break;
- case CALLPKT:
- fprintf( stderr, "<CALLPKT>");
- break;
- case INPUTNAMEPKT:
- fprintf( stderr, "\n");
- break;
- case OUTPUTNAMEPKT:
- if (DEBUG) fprintf( stderr, "<OUTPUTNAMEPKT>");
- break;
- case CONTROLPKT:
- fprintf( stderr, "<CONTROLPKT>");
- break;
- case SYNTAXPKT:
- fprintf( stderr, "<SYNTAXERROR>");
- break;
- default:
- fprintf( stderr, "unknown packet \"%d\"\n", code);
- return 0;
- }
- while (len --) {
- read_and_print_expression( mlp);
- }
- if ((code != INPUTNAMEPKT) && (code != OUTPUTNAMEPKT)) {
- fprintf( stderr, "\n");
- }
- return code;
- } /* ReadPacket */
-
- /*******************************************/
- /* Search for string t in string s */
- /* Return position if found, otherwise -1 */
- /*******************************************/
- int instr(s,t)
- char *s,*t;
- {
- int i,j,k;
-
- for (i=0 ; s[i] && t[0] ; i++)
- {
- for (j=i , k=0 ; t[k] && s[j] == t[k] ; j++ , k++);
- if (!t[k])
- return(i);
- }
- return(-1);
- }
-